package com.example.demo.async;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Async;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @description:
 * @author: cj
 * @create: 15-08-01 15:32:47
 */
@RestController
@Slf4j
@RequestMapping("noToken/async")
public class MyAsync {

    /**
     * 1、在主程序开启异步调用 加上@EnableAsync
     * eg:DemoApplication 类上加 @EnableAsync
     */
    /**
     * 背景
     * 通常，在Java中的方法调用都是同步调用，比如在A方法中调用了B方法，则在A调用B方法之后，必须等待B方法执行并返回后，A方法才可以继续往下执行。这样容易出现的一个问题就是如果B方法执行时间较长，则可能会导致调用A的请求响应迟缓，为了解决这种问题，可以使用Spirng的注解**@Async来用异步调用的方式处理，当然也会有别的多线程方式解决此类问题，本文主要分析@Async**在解决此类问题时的用法以及具体的示例。
     * <p>
     * 异步调用
     * 比如方法A调用方法B，如果B是一个异步方法，则A方法在调用B方法之后，不用等待B方法执行完成，而是直接往下继续执行别的代码。
     *
     * @Async介绍 在Spring中，使用@Async标注某方法，可以使该方法变成异步方法，这些方法在被调用的时候，将会在独立的线程中进行执行，调用者不需等待该方法执行完成。
     */
    @Resource
    MyAsyncService myAsyncService;

    /**
     * 异步方法
     * 默认情况下，Spring 使用 SimpleAsyncTaskExecutor 去执行这些异步方法（此执行器没有限制线程数）。
     * 此默认值可以从两个层级进行覆盖：
     * 方法级别
     * 应用级别
     */
    @RequestMapping("test01")
    public void test01() {
        log.info ( "调用 async 方法之前" );
        myAsyncService.test01 ();
        log.info ( "调用 async 方法之后" );
        try {
            Thread.sleep ( 3000 );
        } catch (InterruptedException e) {
            log.error ( "sleep error." );
        }
        log.info ( "func end." );
    }

}
